package me.zhengjie.server;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import me.zhengjie.dao.dto.MergeTaskQueryCriteria;
import me.zhengjie.utils.PageResult;
import me.zhengjie.vo.merge.MergeContainerList;
import me.zhengjie.vo.merge.MergeCreateResponseVo;
import me.zhengjie.dao.MergeTaskDao;
import me.zhengjie.vo.merge.MergeRequestVo;
import me.zhengjie.vo.merge.MergeContainerRequestVo;
import me.zhengjie.vo.Result;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

public interface MergeTaskService extends IService<MergeTaskDao> {

    /**
     * 查询数据分页
     *
     * @param criteria 条件
     * @param page     分页参数
     * @return PageResult
     */
    PageResult<MergeTaskDao> queryAll(MergeTaskQueryCriteria criteria, Page<Object> page);

    /**
     * 查询所有数据不分页
     *
     * @param criteria 条件参数
     * @return List<MergeTaskDto>
     */
    List<MergeTaskDao> queryAll(MergeTaskQueryCriteria criteria);

    /**
     * 创建
     *
     * @param resources /
     */
    void create(MergeTaskDao resources);

    /**
     * 编辑
     *
     * @param resources /
     */
    void update(MergeTaskDao resources);

    /**
     * 多选删除
     *
     * @param ids /
     */
    void deleteAll(List<String> ids);

    /**
     * 导出数据
     *
     * @param all      待导出的数据
     * @param response /
     * @throws IOException /
     */
    void download(List<MergeTaskDao> all, HttpServletResponse response) throws IOException;

    List<MergeTaskDao> findByTaskByTaskId(String taskId);

    List<MergeTaskDao> findByTaskAll(MergeTaskDao mergeTask);

    MergeTaskDao findByTaskByContainerCode(String containerCode);


    void updateData(MergeTaskDao mergeTaskDao);

    boolean updateStatusTaskStart(String taskId);

    void updateStatusTaskEnd(String taskId, Integer taskStatus, Integer containerStatus);

    void saveDataList(List<MergeTaskDao> taskDaoList);

    /**
     * 流程第一步
     * 查询合箱/托任务清单
     *
     * @param criteria 可合箱/托任务查询对象
     * @return 可合箱/托任务查询结果
     */
    PageResult<MergeTaskDao> findMergeStoreTask(MergeTaskQueryCriteria criteria, Page<MergeTaskDao> page);

    /**
     * 流程第二步
     *
     * @param mergeRequestVo 可合箱/托物料查询对象
     * @return 可合箱/托物料查询结果
     */
    PageResult<MergeCreateResponseVo> findMergeMaterialInfo(MergeRequestVo mergeRequestVo);

    /**
     * 流程第三步
     * 创建合箱/板出库任务单
     *
     * @param request 请求合箱/托对象
     * @return 合箱/托结果
     */
    Result<?> mergeCreateContainerInfo(MergeContainerRequestVo request);


    /**
     * 流程第五步
     * 定时任务处理出库
     */
    void ScheduledFindStoreMergeTask();

    /**
     * 流程第六步
     *
     * @param params 合箱/托任务id
     * @return 修改状态开启合箱任务
     */
    Result<?> startMergeTaskInfo(Map<String, String> params);

    /**
     * 流程第六步
     *
     * @return 查询每个载具对应物料信息
     */
    Result<List<MergeContainerList>> findMergeTaskInfo(Map<String, Object> params);

    /**
     * 流程第七步
     * 重新绑定物料信息到新载具
     *
     * @param itemBarCodeList 物料条码集合
     * @param containerCode   载具编码
     * @return 合箱/托结果
     */
    Result<?> againBindContainerInfo(List<String> itemBarCodeList, String containerCode);

    /**
     * 流程第八步
     * 点击单个载具完成，判断是否回库或者解除储位绑定
     *
     * @param params 载具编码
     * @return 合箱/托结果
     */
    Result<?> successBindContainer(Map<String, String> params);

    /**
     * 流程第九步
     *
     * @return 合箱/托结果
     */
    Result<?> allSuccessBindContainer(String taskId);

    /**
     * 流程第十步
     *
     * @return 合箱/托结果
     */
    Result<?> findExistTask();

}
